SenseMyFEUP data
Data loading
Data is filtered by travelmode (car and bus) and date (April 2016).
Intersession times
Visualizing intersession times
All intersession time Porto April16
Intersession time along the week
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
Histogram intersession time.
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
Number of sessions per way_id
Filtering by sessions per way_id
Edges with >50 sessions.
We recommend that you use the dev version of ggplot2 with `ggplotly()`
Install it with: `devtools::install_github('hadley/ggplot2')`
Top 10% points
Map points April 2016
Showing maps
Traffic Map April Porto 2016 all
Traffic Map April 2016 all >50
Traffic day Map April 2016
Traffic night Map April 2016
Top 12 edges

Map Intersession time (<1.3h) day.

Map Intersession time (<2h)night.

–>
#Sessions by date >50
Day of the week

By day

By hour

Speeds >50
df_hotedges_april16pt %>%
group_by(hour =hour(time)) %>%
summarise(avg_speed = mean((speed*18)/5)) %>%
ggplot(aes(hour, avg_speed)) +
geom_line() +
scale_x_continuous(breaks = seq(0,23,1))+
ylab("Avg speed km/h")

Speed by week

Speed by day
Speed by hour
Number of session per hour
Ways_ids per half hour
prueba <- table(cut(filter(df_hotedges_april16pt, day(time) < 7)$time, breaks = "30 mins"))
plot(prueba, xlab = "date", ylab = "frequency")
Time serie per way_id
filter(df_hotedges_april16pt, way_id == 37141967 ) %>%
group_by(day(time)) %>%
ggplot(aes(x= time, y= (speed*18)/5)) +
geom_line()
LS0tCnRpdGxlOiAnU2Vuc2UgTXkgRkVVUCAtIEFwcmlsIDIwMTYgRGF0YScKYXV0aG9yOiAiRGFuaWVsYSBTLiBHaWwiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyIGVjaG8gPSBGQUxTRSwgZXZhbD1GQUxTRX0Kc2F2ZS5pbWFnZSgiU2Vuc2VteVdvcmtTcGFjZS5SRGF0YSIpCiNsb2FkKCJkZl9maXJzdF9zZXNzaW9uX2NhcnNfYXByaWwxNi5SZGEiKQpsb2FkKCJTZW5zZW15V29ya1NwYWNlLlJEYXRhIikKCmBgYAoKCiMgU2Vuc2VNeUZFVVAgZGF0YQojIyBEYXRhIGxvYWRpbmcKIERhdGEgaXMgZmlsdGVyZWQgYnkgdHJhdmVsbW9kZSAoY2FyIGFuZCBidXMpIGFuZCBkYXRlIChBcHJpbCAyMDE2KS4gICAgICAKCmBgYHtyIGVjaG89RkFMU0V9CiNGaWx0ZXJpbmcgYnkgcmVjdGFuZ2xlIGluIFBvcnRvIAoKZGZfZWRnZXNfYXByaWwxNiA8LSBkZl9zcGVlZAoKZGZfZWRnZXNfYXByaWwxNnB0IDwtIGRmX3NwZWVkICU+JSAKICBmaWx0ZXIobGF0IDwgNDEuMTg1OTM1MjgwODE1NSwgbGF0ID4gNDEuMTM2NDcyNjU0NiwgbG9uID4gLTguNjkxMjk0MDY4MTQwNSwgbG9uIDwgLTguNTUzOTY5MzQyMjgpCmBgYAoKIyMgSW50ZXJzZXNzaW9uIHRpbWVzCgojIyMgVmlzdWFsaXppbmcgaW50ZXJzZXNzaW9uIHRpbWVzCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9RkFMU0V9CgojR2V0dGluZyBkYXRhIGZyb20gZGZfc3BlZWQKCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgPC0gZGZfZWRnZXNfYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQsIHNlc3Npb25faWQpICU+JSAKICBzdW1tYXJpc2Uoc2Vjb25kcyA9IG1pbihzZWNvbmRzKSkKCiMgVHJhbnNmb3JtaW5nIHNlY29uZHMgdG8gdGltZXN0YW1wIGFuZCBjYWxjdWxhdGluZyBpbnRlcnNlc3Npb24gdGltZS4KCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQkdGltZSA8LSBhcy5QT1NJWGN0KGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQkc2Vjb25kcywgb3JpZ2luPSIxOTcwLTAxLTAxIikKZGZfZWRnZXNfYXByaWwxNnB0JHRpbWUgPC0gYXMuUE9TSVhjdChkZl9lZGdlc19hcHJpbDE2cHQkc2Vjb25kcywgb3JpZ2luPSIxOTcwLTAxLTAxIikKCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAgJT4lCiAgYXJyYW5nZShkZXNjKHdheV9pZCksIHRpbWUpICU+JSAKICBtdXRhdGUoaW50ZXJzZXNzaW9uX3RpbWUgPSBjKDAsYXMubnVtZXJpYyhkaWZmKHRpbWUpLCB1bml0cz0ibWlucyIpKSkKCiMgUmVtb3ZlIE1pbiBjb2x1bW4KIyBkZl9pbnRlcnNlc3Npb25fYXByaWwkbWluIDwtIE5VTEwgCmBgYAoKQWxsIGludGVyc2Vzc2lvbiB0aW1lIFBvcnRvIEFwcmlsMTYgCmBgYHtyIGVjaG89RkFMU0V9CnBsb3RfbHkoeSA9IGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQkaW50ZXJzZXNzaW9uX3RpbWUsIHR5cGUgPSAiYm94IiwgbmFtZSA9ICJBbGwgd2F5X2lkcyIpICU+JSAKICBhZGRfYm94cGxvdCh5PSBmaWx0ZXIoZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCwgaW50ZXJzZXNzaW9uX3RpbWUgPiAwICkkaW50ZXJzZXNzaW9uX3RpbWUsIG5hbWUgPSAiQXQgbGVhc3QgMiBzZXNzaW9ucyIpICU+JSAKICBsYXlvdXQodGl0bGU9IkludGVyc2Vzc2lvbiB0aW1lIChtaW5zKSIsIHlheGlzID0gbGlzdChyYW5nZSA9IGMoMCw1MDAwKSkpCgpgYGAKCkludGVyc2Vzc2lvbiB0aW1lIGFsb25nIHRoZSB3ZWVrIApgYGB7ciBlY2hvPUZBTFNFfQpwIDwtIGdncGxvdChkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0LCBhZXMoeCA9IHdlZWtkYXlzKHRpbWUpLCB5ID0gaW50ZXJzZXNzaW9uX3RpbWUsIGZpbGwgPSBpbnRlcmFjdGlvbih3ZWVrZGF5cyh0aW1lKSkgKSkgKyAKICBnZW9tX2JveHBsb3QoKSArIAogIHhsYWIoIkRheXMgb2YgdGhlIHdlZWsiICkgKwogIHlsYWIoIkludGVyc2Vzc2lvbiB0aW1lIChtaW5zKSIpICsKICBnZ3RpdGxlKCJJbnRlcnNlc3Npb24gdGltZShtaW4pIGluIHRoZSB3ZWVrICIpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIikgKwogICAgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHMgPSBjKCJEb21pbmdvIiwgIlNlZ3VuZGEiLCAiVGVyw6dhIiwgIlF1YXJ0YSIsICJRdWludGEiLCAKICAgICJTZXh0YSIsICJTw6FiYWRvIikpICsKICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwxMDAwMCkpCgoKcCA8LSBwbG90bHlfYnVpbGQocCkKcAoKYGBgCgpIaXN0b2dyYW0gaW50ZXJzZXNzaW9uIHRpbWUuCmBgYHtyIGVjaG89RkFMU0V9CgppbnQyIDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lCiAgZmlsdGVyKGludGVyc2Vzc2lvbl90aW1lID4gMCkgJT4lIAogIGdncGxvdChhZXMoaW50ZXJzZXNzaW9uX3RpbWUvNjApKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gOSkgKyAKICBnZ3RpdGxlKCJJbnRlcnNlc3Npb24gdGltZSAoaG91cnMpIikgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltPWMoMCwzMDApKQppbnQyIDwtIGdncGxvdGx5KGludDIpCgppbnQzIDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lCiAgZmlsdGVyKGludGVyc2Vzc2lvbl90aW1lID4gMCkgJT4lIAogIGdncGxvdChhZXMoaW50ZXJzZXNzaW9uX3RpbWUvNjApKSArIAogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMSkgKwogIGNvb3JkX2NhcnRlc2lhbih4bGltID0gYygwLDI1KSkKaW50MyA8LSBnZ3Bsb3RseShpbnQzKQoKc3VicGxvdChpbnQyLGludDMsIG5yb3dzID0gMikKYGBgCgpOdW1iZXIgb2Ygc2Vzc2lvbnMgcGVyIHdheV9pZAoKYGBge3IgZWNobz1GQUxTRSwgIG1lc3NhZ2U9RkFMU0V9CmludDEgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkod2F5X2lkKSAlPiUgCiAgc3VtbWFyaXNlKG5fc2Vzc2lvbnMgPSBuKCkpICU+JSAgCiAgZ2dwbG90KGFlcyh4ID1uX3Nlc3Npb25zKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMTApICsKICBjb29yZF9jYXJ0ZXNpYW4oeGxpbSA9IGMoMCwxNTApKSArCiAgZ2d0aXRsZSgiTnVtYmVyIG9mIHNlc3Npb25zIHBlciB3YXlfaWQgaW4gUG9ydG8iKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gNTAsIHNpemUgPSAxLCBjb2xvdXIgPSAiI0ZGMzcyMSIsCiAgICAgICAgICAgICAgICAgICBsaW5ldHlwZSA9ICJkYXNoZWQiKQoKZ2dwbG90bHkoaW50MSkKYGBgCgojIyMgRmlsdGVyaW5nIGJ5IHNlc3Npb25zIHBlciB3YXlfaWQgCgpgYGB7ciBlY2hvPUZBTFNFfQojQ3JlYXRlIGRmIHdpdGggd2F5X2lkcyB3aXRoID41MCBzZXNzaW9ucwoKZGZfaWRfaG90ZWRnZXNfYXByaWwxNnB0IDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShuX3Nlc3Npb25zID0gbigpKSAlPiUgIAogIGZpbHRlcihuX3Nlc3Npb25zID49IDUwKSAKCmRmX2hvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pZF9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIG1lcmdlKHk9IGRmX2VkZ2VzX2FwcmlsMTZwdCwgYnk9IndheV9pZCIpCgpkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBncm91cF9ieSh3YXlfaWQpICU+JSAKICBzdW1tYXJpc2Uobl9zZXNzaW9ucyA9IG4oKSkgJT4lICAKICBmaWx0ZXIobl9zZXNzaW9ucyA+PSAyMDApIAoKZGZfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgPC0gZGZfaWRfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBtZXJnZSh5PSBkZl9lZGdlc19hcHJpbDE2cHQsIGJ5PSJ3YXlfaWQiKQoKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfSAKIyBQT0lOVFMgZm9yIG1hcHBpbmcKCiNBbGwgd2l0aCBzZXNzaW9ucyA+IDUwCmRmX3BvaW50c19ob3RlZGdlc19hcHJpbDE2cHQgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkod2F5X2lkKSAlPiUgCiAgc3VtbWFyaXNlKG5fc2Vzc2lvbnMgPSBuKCkpICU+JSAKICBmaWx0ZXIobl9zZXNzaW9ucyA+PSA1MCkgJT4lIAogIG1lcmdlKCB5ID0gZGZfcG9pbnRzX2VkZ2Vfb3NtX2FwcmlsMTZwdCwgYnkgPSAid2F5X2lkIikgCgpkZl9wb2ludHNfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgPC0gZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkod2F5X2lkKSAlPiUgCiAgc3VtbWFyaXNlKG5fc2Vzc2lvbnMgPSBuKCkpICU+JSAKICBmaWx0ZXIobl9zZXNzaW9ucyA+PSAyMDApICU+JSAKICBtZXJnZSggeSA9IGRmX3BvaW50c19lZGdlX29zbV9hcHJpbDE2cHQsIGJ5ID0gIndheV9pZCIpIAoKCmRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0IDwtbXV0YXRlKGRmX3N1cGVyaG90ZWRnZXNfYXByaWwxNnB0LCBjbGFzcyA9IGlmZWxzZShob3VyKHRpbWUpID49NyAmIGhvdXIodGltZSkgPD0gMjAsIAogICAgICAgICAgICAgICAgICAgICAgICAiZGF5IiwKICAgICAgICAgICAgICAgICAgICAgICAgIm5pZ2h0IikpCgoKI0RheQpkZl9wb2ludHNfaG90ZWRnZXNfYXByaWwxNnB0X2QgPC0gZGZfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBmaWx0ZXIoaG91cih0aW1lKSA+PTcsIGhvdXIodGltZSk8PSAyMCwgbl9zZXNzaW9ucyA+PSA1MCkgJT4lIAogIG1lcmdlKCB5ID0gZGZfcG9pbnRzX2VkZ2Vfb3NtX2FwcmlsMTZwdCwgYnkgPSAid2F5X2lkIikgCgojIE5pZ2h0CmRmX3BvaW50c19hcHJpbDE2cHRfbmlnaHRfbiA8LSBkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGZpbHRlcihob3VyKHRpbWUpIDw3IHwgaG91cih0aW1lKSA+IDIwLCBuX3Nlc3Npb25zID49IDIwKSAlPiUgCiAgbWVyZ2UoIHkgPSBkZl9wb2ludHNfZWRnZV9vc21fYXByaWwxNnB0LCBieSA9ICJ3YXlfaWQiKSAKCmBgYAoKYGBge3IgZWNobz1GQUxTRX0KZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCA8LSBtdXRhdGUoZGZfaW50ZXJzZXNzaW9uX2FwcmlsMTZwdCwgY2xhc3MgPSBpZmVsc2UoaG91cih0aW1lKSA+PTcgJiBob3VyKHRpbWUpIDw9IDIwLCAKICAgICAgICAgICAgICAgICAgICAgICAgImRheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJuaWdodCIpKQogIApgYGAKCgpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQojTmVjZXNzYXJ5IGZvciBtYXBwaW5nIAoKI1Jlb3JkZXIgY29sdW1ucwpkZl9vc21fZWRnZSA8LSBkZl9wb2ludHNfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBzZWxlY3Qod2F5X2lkLCBwb2ludHMpCgpkZl9vc21fZWRnZSA8LSBkZl9wb2ludHNfc3VwZXJob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIHNlbGVjdCh3YXlfaWQsIHBvaW50cykKCiNMaXN0IGJlZm9yZSBwYXNzaW5nIHRvIG1hcC4KbGlzdF9vc21fZWRnZSA8LSBkZl9vc21fZWRnZVssIDFdCgpgYGAKCiMjIyBFQ0RGIApgYGB7ciBlY2hvPUZBTFNFfQplMSA8LSBnZ3Bsb3Qoc3Vic2V0KGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQsIGludGVyc2Vzc2lvbl90aW1lID4gMCksIGFlcyhpbnRlcnNlc3Npb25fdGltZSkpICsgCiAgc3RhdF9lY2RmKGdlb20gPSAic3RlcCIpICsKICB4bGFiKCJJbnRlcnNlc3Npb24gdGltZShtaW5zKSIpCgplMiA8LSBnZ3Bsb3Qoc3Vic2V0KGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQsIGludGVyc2Vzc2lvbl90aW1lID4gMCksIGFlcyhpbnRlcnNlc3Npb25fdGltZSkpICsgCiAgc2NhbGVfeF9sb2cxMCgpICtzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgICsgeGxhYigiSW50ZXJzZXNzaW9uIHRpbWUgTG9nIikKCmdyaWQuYXJyYW5nZShlMSwgZTIsIG5jb2w9IDIsIHRvcCA9ICJJbnRlcnNlc3Npb24gdGltZSBhbGwgc2Vzc2lvbnMgUG9ydG8gKG1pbnMpIikKYGBgCiAKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0KCiNEb250LCB3aXRob3V0IGNvbG9ycwplMyA8LSAgZ2dwbG90KGRmX2hvdGVkZ2VzX2FwcmlsMTZwdF9kYXksIGFlcyhhdmdfaXRtKSkgKyAKICBzY2FsZV94X2xvZzEwKGJyZWFrcyA9IHNlcSgwLDEwMDAsMjAwKSkgKwogIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSAgKyAKICB4bGFiKCIgTG9nIEludGVyc2Vzc2lvbiB0aW1lKG1pbikiKSAKICAKZTQgPC0gIGdncGxvdChkZl9ob3RlZGdlc19hcHJpbDE2cHRfbmlnaHQsIGFlcyh4ID0gYXZnX2l0bSkpICsgCiAgc2NhbGVfeF9sb2cxMChicmVha3MgPSBzZXEoMCwxMDAwLDIwMCkpICsKICBzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgICsKICB4bGFiKCIgTG9nIEludGVyc2Vzc2lvbiB0aW1lKG1pbikiKSAKCmdyaWQuYXJyYW5nZShlMywgZTQsIG5jb2w9IDIsIHRvcCAgPSAiRUNERiBBdmVyYWdlIEludGVyc2Vzc2lvbiB0aW1lIGRheSg+NTApICIpCmBgYAoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1GQUxTRX0KIyBDbGFzc2lmeWluZyBwb2ludHMgYnkgZGF5IGZvciBFQ0RGIApkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0IDwtbXV0YXRlKGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQsIGNsYXNzID0gaWZlbHNlKGhvdXIodGltZSkgPj03ICYgaG91cih0aW1lKSA8PSAyMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICJkYXkiLAogICAgICAgICAgICAgICAgICAgICAgICAibmlnaHQiKSkKCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGZpbHRlcihpbnRlcnNlc3Npb25fdGltZSA+MCkgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9ob3RlZGdlc19hcHJpbDE2cHQkd2F5X2lkKSAlPiUgCiAgZ2dwbG90KCBhZXMoaW50ZXJzZXNzaW9uX3RpbWUsIGNvbG9yPSBjbGFzcyApKSArIAogIHNjYWxlX3hfbG9nMTAoKSArIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSArIAogIGdndGl0bGUoIkludGVyc2Vzc2lvbiB0aW1lID41MCBzZXNzaW9ucyBQb3J0byIpCmBgYAoKCmBgYHtyIGVjaG89RkFMU0V9CmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGZpbHRlcihpbnRlcnNlc3Npb25fdGltZSA+MCkgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCR3YXlfaWQpICU+JSAKICBnZ3Bsb3QoIGFlcyhpbnRlcnNlc3Npb25fdGltZSwgY29sb3I9IGNsYXNzICkpICsgCiAgc2NhbGVfeF9sb2cxMCgpICsgc3RhdF9lY2RmKGdlb20gPSAic3RlcCIpICsgCiAgZ2d0aXRsZSgiSW50ZXJzZXNzaW9uIHRpbWUgPjIwMCBzZXNzaW9ucyBQb3J0byIpCmBgYAoKCmBgYHtyICBlY2hvID0gRkFMU0UsIGV2YWwgPSBGQUxTRSB9CgojIFNhbWUgYXMgcGxvdGx5IGJlZm9yZSBidXQgc2VwYXJhdGUuIElnbm9yZS4gCgpFQ0RGIGFsbCBieSAjcG9pbnRzIAplY2RmX2FsbCA8LSBnZ3Bsb3QoZGZfb3NtX2VkZ2UsIGFlcyhwb2ludHMpKSArIAogIHNjYWxlX3hfbG9nMTAoKSArIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSArIHhsYWIoIkFsbCBwb2ludHMiKQoKZWNkZl9kYXk8LSBnZ3Bsb3QoZGZfb3NtX2VkZ2UsIGFlcyhwb2ludHMpKSArIAogIHNjYWxlX3hfbG9nMTAoKSArIHN0YXRfZWNkZihnZW9tID0gInN0ZXAiKSArIHRpdGxlKCJFQ0RGIGRheSIpKyB4bGFiKCJQb2ludHMgYXQgZGF5IikKCmVjZGZfbmlnaHQgPC0gZ2dwbG90KGRmX29zbV9lZGdlLCBhZXMocG9pbnRzKSkgKyAKICBzY2FsZV94X2xvZzEwKCkgKyBzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgKyB0aXRsZSgiRUNERiBuaWdodCIpKyB4bGFiKCJQb2ludHMgYXQgbmlnaHQiKQoKZ3JpZC5hcnJhbmdlKGVjZGZfYWxsLGVjZGZfZGF5LGVjZGZfbmlnaHQsICBuY29sPTMpCgpgYGAKCgpFQ0RGIGJ5ICNzZXNzaW9ucyAKCmBgYHtyIGVjaG89RkFMU0V9CmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KHdheV9pZCkgJT4lIAogIHN1bW1hcmlzZShzZXNzaW9ucyA9IG4oKSApICU+JSAKICBnZ3Bsb3QoYWVzKHNlc3Npb25zKSkgKyAKICBzY2FsZV94X2xvZzEwKCkgKyBzdGF0X2VjZGYoZ2VvbSA9ICJzdGVwIikgKwogIGdndGl0bGUoIkVDREYgbnVtYmVyIG9mIHNlc3Npb25zIGFsbCBQb3J0byIpCiAgCmBgYAoKIyMjICBFZGdlcyB3aXRoID41MCBzZXNzaW9ucy4gCgoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQpsb3cxIDwtIGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9ob3RlZGdlc19hcHJpbDE2cHQkd2F5X2lkKSAlPiUgCiAgc3Vic2V0KCBpbnRlcnNlc3Npb25fdGltZSA8IHF1YW50aWxlKGRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQkaW50ZXJzZXNzaW9uX3RpbWUsIDAuMzUpKSAlPiUgCiAgZ2dwbG90KGFlcyhpbnRlcnNlc3Npb25fdGltZSkpICsKICBnZW9tX2hpc3RvZ3JhbShiaW5zID0gMTApICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDIwMCwxMCkpKwogIHhsYWIoIkludGVyc2Vzc2lvbiB0aW1lIChtaW5zKSIpICsgCiAgZ2d0aXRsZSgiTG93ZXN0IDM1JSBpbnRlcnNlc3Npb24gdGltZSA+NTAiKQoKZ2dwbG90bHkobG93MSkKYGBgCgoKYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFfQpjMSA8LSBkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBzdWJzZXQod2F5X2lkICVpbiUgZGZfaG90ZWRnZXNfYXByaWwxNnB0JHdheV9pZCkgJT4lIAogIGdncGxvdChhZXMoaW50ZXJzZXNzaW9uX3RpbWUsIGZpbGwgPSBjbGFzcykpICsgCiAgZ2VvbV9oaXN0b2dyYW0oKSArIAogIHhsYWIoIkludGVyc2Vzc2lvbiB0aW1lIChtaW4pIikgKwogIHhsaW0oYygwLDMwMDApKSArCiAgeWxpbShjKDAsNTAwMCkpICsKICBnZ3RpdGxlKCJJbnRlcnNlc3Npb24gdGltZSA+NTAgZGF5L25pZ2h0IikKCmdncGxvdGx5KGMxKSAKYGBgCgoKClRvcCAxMCUgcG9pbnRzCmBgYHtyIGVjaG8gPSBGQUxTRSwgZXZhbD1UUlVFfQoKI05vdCBuZWNlc3NhcnkgCgpzdW1tYXJ5KGRmX3BvaW50c19ob3RlZGdlc19hcHJpbDE2cHQkcG9pbnRzKQpxdWFudGlsZShkZl9wb2ludHNfaG90ZWRnZXNfYXByaWwxNnB0JHBvaW50cywgMC45MCkKCiBib3hwbG90KGRmX3BvaW50c19ob3RlZGdlc19hcHJpbDE2cHQkcG9pbnRzKSAgCgoKYGBgCgoKIyMgTWFwIHBvaW50cyBBcHJpbCAyMDE2CgpgYGB7ciBlY2hvPUZBTFNFLCBldmFsPUZBTFNFfQojIENyZWF0aW5nIHRoZSBlbXB0eSBtYXAgb2YgUG9ydG8KCiNQb2ludHMKI2JveHBsb3QoZGZfb3NtX2VkZ2UkcG9pbnRzKQoKZmV1cCA8LSAgIHF1YW50aWxlKGRmX29zbV9lZGdlJHBvaW50cywgMC45KQpzdXBlcmlvciA8LSBxdWFudGlsZShkZl9vc21fZWRnZSRwb2ludHMsIDAuNykKbWVkaW8gPC0gcXVhbnRpbGUoZGZfb3NtX2VkZ2UkcG9pbnRzLCAwLjUpCmxvdyA8LSBxdWFudGlsZShkZl9vc21fZWRnZSRwb2ludHMsIDAuNSkKbG93IDwtIDAKCm0gPC0gbGVhZmxldCgpICU+JSBzZXRWaWV3KGxuZz0tOC42MTQxOSwgbGF0PTQxLjE2MzExLCB6b29tID0gMTMpCm0gPC0gYWRkVGlsZXMobSkgCm0gPC0gYWRkUHJvdmlkZXJUaWxlcyhtLCAiQ2FydG9EQi5Qb3NpdHJvbiIpCgoKY291bnRlciA8LSAxCgpmb3Iod2F5X2lkIGluIGxpc3Rfb3NtX2VkZ2UpIHsKICAKICBkZl93YXlfaWQgPC0gZGJHZXRRdWVyeShjb25fb3NtLCBwYXN0ZTAoIlNFTEVDVCBzdF9hc3RleHQoc3RfdHJhbnNmb3JtKHdheSwgNDMyNikpIEFTIGxpbmUgRlJPTSBwbGFuZXRfb3NtX2xpbmUgV0hFUkUgcGxhbmV0X29zbV9saW5lLm9zbV9pZCA9ICIsIHdheV9pZCkpCiAgCiAgbGluZSA8LSBkZl93YXlfaWQkbGluZQogIGxpbmUgPC0gYXMuY2hhcmFjdGVyKGxpbmUpCiAgCiAgbGluZSA8LSB1bmxpc3Qoc3Ryc3BsaXQobGluZSwgc3BsaXQ9JygnLCBmaXhlZD1UUlVFKSlbMl0KICBsaW5lIDwtIHN1YnN0cihsaW5lLCAxLCBuY2hhcihsaW5lKSAtIDEpCiAgCiAgcGFyc2VkX2xpbmUgPC0gc3Ryc3BsaXQobGluZSwgIiwiKQogIAogIGxvbnMgPC0gYygpCiAgbGF0cyA8LSBjKCkKICAKICBpZihsZW5ndGgocGFyc2VkX2xpbmUpICE9IDApIHsKICAgIAogICAgI0RlZmluaW5nIGxvbnMgYW5kIGxhdHMgYXMgdmFyaWFibGVzIHRvIHVzZSBsYXRlci4KCiAgICBmb3IoY29vcmQgaW4gcGFyc2VkX2xpbmVbWzFdXSkgewogICAgICAKICAgICAgbG9uIDwtIHVubGlzdChzdHJzcGxpdChjb29yZCwgc3BsaXQ9JyAnLCBmaXhlZD1UUlVFKSlbMV0KICAgICAgbGF0IDwtIHVubGlzdChzdHJzcGxpdChjb29yZCwgc3BsaXQ9bG9uLCBmaXhlZD1UUlVFKSlbMl0KICAgICAgbGF0IDwtIHN1YnN0cihsYXQsIDIsIG5jaGFyKGxhdCkpCiAgICAgIAogICAgICBsb24gPC0gYXMubnVtZXJpYyhsb24pCiAgICAgIGxhdCA8LSBhcy5kb3VibGUobGF0KQogICAgICAKICAgICAgbG9ucyA8LSBjKGxvbnMsIGxvbikKICAgICAgbGF0cyA8LSBjKGxhdHMsIGxhdCkKICAgICAgCiAgICB9CiAgICAKICAgICMgRGVjaWRpbmcgdGhlIGNvbG9yIG9mIHRoZSBwb2ludC4KCiAgICBpZihkZl9vc21fZWRnZVtjb3VudGVyLCAyXSA+IGZldXApIHsKICAgICAgICAgIAogICAgICAgICAgbSA8LSBhZGRQb2x5bGluZXMobSwgbG9ucywgbGF0cywgY29sb3I9J2JsdWUnLCBwb3B1cCA9IHBhc3RlKCIiLCB3YXlfaWQsIHNlcCA9ICIiKSkgCiAgICAKICAgICAgICB9IGVsc2UgaWYgKGRmX29zbV9lZGdlW2NvdW50ZXIsIDJdID49IHN1cGVyaW9yICYmIGRmX29zbV9lZGdlW2NvdW50ZXIsIDJdIDw9IGZldXApIHsKICAgICAgICAgIAogICAgICAgICAgbSA8LSBhZGRQb2x5bGluZXMobSwgbG9ucywgbGF0cywgY29sb3I9J3JlZCcsIHBvcHVwID0gcGFzdGUoIiIsIHdheV9pZCwgc2VwID0gIiIpKSAgCiAgICAgICAgCiAgICAgICAgfSBlbHNlIGlmIChkZl9vc21fZWRnZVtjb3VudGVyLCAyXSA+PSBtZWRpbyAmJiBkZl9vc21fZWRnZVtjb3VudGVyLCAyXSA8PSBzdXBlcmlvcikgewogICAgICAgICAgCiAgICAgICAgICBtIDwtIGFkZFBvbHlsaW5lcyhtLCBsb25zLCBsYXRzLCBjb2xvcj0neWVsbG93JywgcG9wdXAgPSBwYXN0ZSgiIiwgd2F5X2lkLCBzZXAgPSAiIikpCiAgICAgICAgICAKICAgICAgICB9IGVsc2UgaWYgKGRmX29zbV9lZGdlW2NvdW50ZXIsIDJdID49IGxvdyAmJiBkZl9vc21fZWRnZVtjb3VudGVyLCAyXSA8PSBtZWRpbykgewogICAgICAgICAgCiAgICAgICAgICBtIDwtIGFkZFBvbHlsaW5lcyhtLCBsb25zLCBsYXRzLCBjb2xvcj0nZ3JlZW4nLCBwb3B1cCA9IHBhc3RlKCIiLCB3YXlfaWQsIHNlcCA9ICIiKSkKICAgICAgICAgIAogICAgICAgIH0KICAgICAgICAKICAgICAgICBjb3VudGVyIDwtIGNvdW50ZXIgKyAxIAogICAgICAgIAogICAgICB9CiAgICAgIAogICAgICAjY29udGVudCA8LSBwYXN0ZSgidyIsIHdheV9pZCwgc2VwID0gIiIpCiAgICAgICNtIDwtIGFkZFBvcHVwcyhtLCBsb25zLCBsYXRzLCBjb250ZW50LCBvcHRpb25zID0gcG9wdXBPcHRpb25zKGNsb3NlQnV0dG9uID0gVFJVRSkpCiAgICAgICNtIDwtIGFkZExhYmVsT25seU1hcmtlcnMobSwgbG9ucyxsYXRzLCBsYWJlbCA9IHBhc3RlKCIiLCB3YXlfaWQsIHNlcCA9ICIiKSwgCiAgICAgICMgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zKG5vSGlkZSA9IEYsIHRleHRzaXplID0gIjE1cHgiKSkKICAgICAgI3ByaW50KGxpbmUpCiAgICAKICAgIH0KCmBgYAojIyMgU2hvd2luZyBtYXBzIAoKVHJhZmZpYyAgTWFwIEFwcmlsIFBvcnRvIDIwMTYgYWxsCmBgYHtyIGV2YWw9IFRSVUV9CiMgU2hvd2luZyBNYXAuCm0xIDwtIG0KbTEKI21hcHNob3QobSwgdXJsID0gcGFzdGUwKGdldHdkKCksICIvbWFwLmh0bWwiKSkKYGBgCgpUcmFmZmljICBNYXAgQXByaWwgMjAxNiBhbGwgPjUwCmBgYHtyIGVjaG89RkFMU0V9Cm1fNTAgPC0gbQptXzUwIApgYGAKClRyYWZmaWMgZGF5IE1hcCBBcHJpbCAyMDE2CmBgYHtyIGVjaG89RkFMU0V9Cm1fNTBfZGF5IDwtIG0KbV81MF9kYXkKYGBgCgpUcmFmZmljIG5pZ2h0IE1hcCBBcHJpbCAyMDE2CmBgYHtyIGVjaG89RkFMU0V9Cm1fMjBfbmlnaHQgPC0gbQptXzIwX25pZ2h0CmBgYAoKVG9wIDEyIGVkZ2VzIAoKYGBge3IgZWNobz1GQUxTRX0KbV9ob3QgPC0gbQptX2hvdApgYGAKCjwhLS0gSWdub3JlIHRoaXMgbWFwcyBmb3IgdGhlIG1vbWVudCAgIApNYXAgSW50ZXJzZXNzaW9uIHRpbWUgYWxsIDEuMzBoLgpgYGB7ciBlY2hvPUZBTFNFfQptX2l0bSA8LSBtCm1faXRtCmBgYAoKTWFwIEludGVyc2Vzc2lvbiB0aW1lICg8MS4zaCkgZGF5LgpgYGB7ciBlY2hvPUZBTFNFfQptX2l0bV9kYXkgPC0gbQptX2l0bV9kYXkKI21hcHNob3QobV9uaWdodF9zZW1zZXNzaW9ucywgZmlsZSA9ICJ+L21hcHMvdG9wX2ludGVyc2Vzc2lvbnNfbmlnaHRfYXByaWwucG5nIikKYGBgCk1hcCBJbnRlcnNlc3Npb24gdGltZSAoPDJoKW5pZ2h0LgpgYGB7ciBlY2hvPUZBTFNFfQptX2l0bV9uaWdodCA8LSBtCm1faXRtX25pZ2h0CiNtYXBzaG90KG0sIGZpbGUgPSAifi9tYXBzL19hbGxfYXByaWwucG5nIikKYGBgCi0tPgoKIyMgI1Nlc3Npb25zIGJ5IGRhdGUgPjUwCgojIyMgRGF5IG9mIHRoZSB3ZWVrIApgYGB7ciBlY2hvPSBGQUxTRX0gCmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9ob3RlZGdlc19hcHJpbDE2cHQkd2F5X2lkKSAlPiUgCiAgZ3JvdXBfYnkod2Vla2RheSA9d2RheSh0aW1lKSkgJT4lIAogIHN1bW1hcmlzZSh3YXlfaWRzID0gbigpKSAlPiUgCiAgZ2dwbG90KGFlcyh3ZWVrZGF5LHdheV9pZHMpKSArIAogIGdlb21fbGluZSgpICsKICBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cyA9IGMoIkRvbWluZ28iLCAiU2VndW5kYSIsICJUZXLDp2EiLCAiUXVhcnRhIiwgIlF1aW50YSIsIAogICAgIlNleHRhIiwgIlPDoWJhZG8iKSkKCmBgYAoKIyMjIEJ5IGRheSAKYGBge3IgZWNobz0gRkFMU0V9CmRmX2ludGVyc2Vzc2lvbl9hcHJpbDE2cHQgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9ob3RlZGdlc19hcHJpbDE2cHQkd2F5X2lkKSAlPiUgCiAgZ3JvdXBfYnkoZGF5ID1kYXkodGltZSkpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoZGF5LG4pKSArIAogIGdlb21fbGluZSgpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgxLDMwLDEpKQoKYGBgCgojQnkgaG91ciAKYGBge3IgZWNobz0gRkFMU0V9IApkZl9pbnRlcnNlc3Npb25fYXByaWwxNnB0ICU+JSAKICBzdWJzZXQod2F5X2lkICVpbiUgZGZfaG90ZWRnZXNfYXByaWwxNnB0JHdheV9pZCkgJT4lIAogIGdyb3VwX2J5KGhvdXIgPWhvdXIodGltZSkpICU+JSAKICBzdW1tYXJpc2UobiA9IG4oKSkgJT4lIAogIGdncGxvdChhZXMoaG91cixuKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDIzLDEpKQoKYGBgCgojIyBTcGVlZHMgPjUwCgpgYGB7cn0KIyBTcGVlZCBieSB3YXlfaWQgYW5kIHNlc3Npb24uXAphdmdfc3BlZWRfd2F5aWQgPC0gZGZfc3BlZWQgJT4lIAogIHN1YnNldCh3YXlfaWQgJWluJSBkZl9ob3RlZGdlc19hcHJpbDE2cHQkd2F5X2lkKSAlPiUgCiAgZ3JvdXBfYnkod2F5X2lkKSAlPiUgCiAgc3VtbWFyaXNlKGF2Z19zcGVlZCA9IG1lYW4oKHNwZWVkKjE4KS81KSwgbiA9IG4oKSApCgpnZ3Bsb3QoYXZnX3NwZWVkX3dheWlkLCBhZXMoYXZnX3NwZWVkKSkgKwogIGdlb21faGlzdG9ncmFtKGJpbndpZHRoID0gMykgKyAKICBzY2FsZV94X2NvbnRpbnVvdXMobmFtZSA9ICJBdmdfc3BlZWQoa20vaCkiLCAgYnJlYWtzID0gc2VxKDAsIDE1MCwgMykgKQpgYGAKClNwZWVkIGJ5IHdlZWsgCmBgYHtyIGVjaG89RkFMU0V9CmRmX2hvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZ3JvdXBfYnkod2Vla2RheSA9d2RheSh0aW1lKSkgJT4lIAogIHN1bW1hcmlzZShhdmdfc3BlZWQgPSBtZWFuKChzcGVlZCoxOCkvNSkpICU+JSAKICBnZ3Bsb3QoYWVzKHdlZWtkYXksIGF2Z19zcGVlZCkpICsgCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX3hfZGlzY3JldGUobGltaXRzID0gYygiRG9taW5nbyIsICJTZWd1bmRhIiwgIlRlcsOnYSIsICJRdWFydGEiLCAiUXVpbnRhIiwgCiAgICAiU2V4dGEiLCAiU8OhYmFkbyIpKSArCiAgeWxhYigiQXZnIHNwZWVkIGttL2giKQpgYGAKClNwZWVkIGJ5IGRheQoKYGBge3IgZWNobz1GQUxTRX0KZGZfaG90ZWRnZXNfYXByaWwxNnB0ICU+JSAKICBncm91cF9ieShkYXkgPWRheSh0aW1lKSkgJT4lIAogIHN1bW1hcmlzZShhdmdfc3BlZWQgPSBtZWFuKChzcGVlZCoxOCkvNSkpICU+JSAKICBnZ3Bsb3QoYWVzKGRheSwgYXZnX3NwZWVkKSkgKyAKICBnZW9tX2xpbmUoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLDMwLDEpKSsKICB5bGFiKCJBdmcgc3BlZWQga20vaCIpCmBgYAoKU3BlZWQgYnkgaG91cgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogIGdyb3VwX2J5KGhvdXIgPWhvdXIodGltZSkpICU+JSAKICBzdW1tYXJpc2UoYXZnX3NwZWVkID0gbWVhbigoc3BlZWQqMTgpLzUpKSAlPiUgCiAgZ2dwbG90KGFlcyhob3VyLCBhdmdfc3BlZWQpKSArIAogIGdlb21fbGluZSgpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjMsMSkpKwogIHlsYWIoIkF2ZyBzcGVlZCBrbS9oIikKYGBgCgpOdW1iZXIgb2Ygc2Vzc2lvbiBwZXIgaG91cgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9ob3RlZGdlc19hcHJpbDE2cHQgJT4lIAogICAgZmlsdGVyKHdkYXkodGltZSkgIT0gMSAsIHdkYXkodGltZSkgIT0gNyApICU+JSAKICAgIGdyb3VwX2J5KGhvdXIgPWhvdXIodGltZSkpICU+JSAKICAgIHN1bW1hcmlzZShzZXNzaW9ucyA9IG5fZGlzdGluY3Qoc2Vzc2lvbl9pZCkpICU+JSAKICBnZ3Bsb3QoYWVzKGhvdXIsIHNlc3Npb25zKSkgKyAKICBnZW9tX2xpbmUoKSsKICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsMjMsMSkpCmBgYAoKV2F5c19pZHMgcGVyIGhhbGYgaG91cgpgYGB7cn0KcHJ1ZWJhIDwtIHRhYmxlKGN1dChmaWx0ZXIoZGZfaG90ZWRnZXNfYXByaWwxNnB0LCBkYXkodGltZSkgPCA3KSR0aW1lLCBicmVha3MgPSAiMzAgbWlucyIpKQpwbG90KHBydWViYSwgeGxhYiA9ICJkYXRlIiwgeWxhYiA9ICJmcmVxdWVuY3kiKSAKYGBgCgojIyBUaW1lIHNlcmllIHBlciB3YXlfaWQgCgpgYGB7ciBlY2hvPUZBTFNFfQpkZl9zdXBlcmhvdGVkZ2VzX2FwcmlsMTZwdCAlPiUgCiAgZmlsdGVyKCB3YXlfaWQgPT0gbGlzdF9vc21fZWRnZVszXSApICU+JSAKICBwbG90X2x5KHg9IH50aW1lLCB5PSB+KHNwZWVkKjE4KS81LCBjb2xvciA9IH5jbGFzcykgJT4lIAogIGxheW91dCh0aXRsZSA9IHBhc3RlKCJUaW1lIHNlcmllcyBvZiBzcGVlZCBmb3Igd2F5X2lkIixsaXN0X29zbV9lZGdlWzNdLCBzZXAgPSAiICIgKSx5YXhpcyA9IGxpc3QodGl0bGU9IlNwZWVkIChrbS9oKSIpLAogICAgICAgICB4YXhpcyA9IGxpc3QodGl0bGU9IkRhdGUiKSkKCmBgYAoKYGBge3J9CmZpbHRlcihkZl9ob3RlZGdlc19hcHJpbDE2cHQsIHdheV9pZCA9PSAzNzE0MTk2NyApICU+JSAKICBncm91cF9ieShkYXkodGltZSkpICU+JSAKICBnZ3Bsb3QoYWVzKHg9IHRpbWUsIHk9IChzcGVlZCoxOCkvNSkpICsgCiAgZ2VvbV9saW5lKCkKYGBgCgoKCgo=